// 创建一个链式栈 并实现栈的基本操作
#include <stdio.h>
#include <stdlib.h>

// 定义栈节点
typedef struct node
{
    int data;
    struct node *next;
} node;

// 定义栈
typedef struct Stack
{
    node *top;
    int size; // 栈大小
} Stack;

// 初始化栈
void initstack(Stack *stack);
// 入栈
int push(Stack *stack, int data);
// 出栈
int pop(Stack *stack, int *value);
// 获取栈顶元素
int top(Stack stack, int *value);
// 判断是否为空
int isEmpty(Stack stack);
// 销毁栈
int destroyStack(Stack *stack);
// 求栈的大小
int getStack(Stack stack);
// 打印栈
void printStack(Stack stack);

int main(int argc, char const *argv[])
{
    Stack linkstack;
    // 初始化栈
    initstack(&linkstack);
    // 入栈
    push(&linkstack, 1);
    push(&linkstack, 2);
    push(&linkstack, 3);
    push(&linkstack, 4);
    push(&linkstack, 5);

    printf("栈的大小为:%d\n", getStack(linkstack));
    printStack(linkstack);
    int t;
    if(!top(linkstack,&t))printf("栈顶为:%d\n",t);
    

    // 出栈
    int dat;
    if (!pop(&linkstack, &dat))
        printf("出栈数据:%d\n", dat);
    else
        printf("stack pop is error\n");
    if (!pop(&linkstack, &dat))
        printf("出栈数据:%d\n", dat);
    else
        printf("stack pop is error\n");
    if (!pop(&linkstack, &dat))
        printf("出栈数据:%d\n", dat);
    else
        printf("stack pop is error\n");

    printf("栈的大小为:%d\n", getStack(linkstack));
    printStack(linkstack);
    getStack(linkstack);
    if(!top(linkstack,&t))printf("栈顶为:%d\n",t);

    //销毁
    destroyStack(&linkstack);
    printf("栈的大小为:%d\n", getStack(linkstack));
    return 0;
}

// 初始化栈
void initstack(Stack *stack)
{
    stack->top = NULL;
    stack->size = 0;
}

// 入栈
int push(Stack *stack, int data)
{
    // 创建一个新的结点
    node *newnode = (node *)malloc(sizeof(node));
    if (newnode == NULL)
    {
        return -1;
    }
    newnode->data = data;
    newnode->next = NULL;

    // 将新结点放在栈顶(表头)
    newnode->next = stack->top;
    stack->top = newnode;
    stack->size++;
    return 0;
}

// 出栈
int pop(Stack *stack, int *value)
{
    if (isEmpty(*stack))
    {
        return 1;
    }
    // 从表头开始出来
    *value = stack->top->data;
    node *temp = stack->top;
    // 更新一下栈顶
    stack->top = temp->next;
    // 释放之前的栈顶
    free(temp);
    stack->size--;
    return 0;
}

// 获取栈顶元素
int top(Stack stack, int *value)
{
    if (isEmpty(stack))
    {
        return 1;
    }
    *value = stack.top->data;
    return 0;
}

// 判断是否为空
int isEmpty(Stack stack)
{
    return stack.top == NULL;
}

// 销毁栈
int destroyStack(Stack *stack)
{
    if (isEmpty(*stack))
    {
        return 1;
    }
    node *temp = stack->top;
    while (temp != NULL)
    {
        stack->top = temp->next;
        free(temp);
        stack->size--;
        temp = stack->top;
    }
    return 0;
}

// 求栈的大小
int getStack(Stack stack)
{
    return stack.size;
}

// 打印栈
void printStack(Stack stack)
{
    if (isEmpty(stack))
    {
        return ;
    }
    node *temp = stack.top;
    while (temp)
    {
        printf("%d\t", temp->data);
        temp = temp->next;
    }
    printf("\n");
}